#ifndef __ZOMBIESWARM_H__
#define __ZOMBIESWARM_H__

#include "Zombie.h"

class ZombieSwarm {

 private:

  // Atributos Bullet --------------------------------------------------

  btDiscreteDynamicsWorld* _pWorld;
  btCylinderShape* _pZombieCollisionShape;

  // Atributos Ogre ----------------------------------------------------

  Ogre::SceneManager* _pSceneManager;
  Ogre::SceneNode* _pSwarmNode;

  // Atributos OpenSteer -----------------------------------------------

  OpenSteer::Vec3 _swarmCenter;

  // Otros atributos ---------------------------------------------------

  std::vector<Zombie*> _zombies;
  std::vector<Zombie*>::iterator _zombiesIt;

  Human* _pHuman; // Puntero a humano
  int _nZombies; // Número de zombis de la horda
  int _maxDistance; // Distancia máxima de los zombis al centro


  // Métodos própios privados ------------------------------------------

  // Calcular el centro de la horda
  void updateSwarmCenter();

  // Llamar al método update en cada zombie de la horda
  void updateZombies(const float, const float);

  // Calcular una posición inicial aleatoria para cada zombi
  OpenSteer::Vec3 randomPositionInSwarm() const;

 public:

  // Constructores y destructores --------------------------------------

  ZombieSwarm(btDiscreteDynamicsWorld* pWorld,
              btCylinderShape* pZombieCollisionShape,
              Ogre::SceneManager* pSceneManager,
              OpenSteer::Vec3 position,
              Human* pHuman,
              int nZombies);

  ~ZombieSwarm();

  // Métodos propios ---------------------------------------------------

  // Actualizar cada zombi y la posición de la horda
  void update(const float currentTime, const float elapsedTime);

  // Devolver centro de la horda
  OpenSteer::Vec3 swarmCenter() const { return _swarmCenter; }

  // Calcular la distancia máxima
  void updateMaxDistance();

  // Devolver distancia máxima
  float maxDistance() const { return _maxDistance; }
};

#endif

